<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  


  <script>
  
  /**
   * 
   * 一般js放到
   * 
   * 基本数据类型和引用数据类型
   * push
   * pop
   * shift
   * unshift
   * slice
   * split
   * 
   * 
   * 栈内存：作用域 --- 1，提供一个供js代码执行的环境，执行栈
   *    由于基本数据类型值比较简单，他们都是直接在栈内存中开辟一个位置
   *    当栈内存被销毁，
   * 堆内存：引用值对应的空间
   *    存储引用类型值的（对象：键值对 函数：代码字符串）
   *    当前堆内存释放销毁，那么这个引用值彻底没了
   *    堆内存释放：当堆内存没有被任何变量占用，浏览器会在空间的时候，
   *    自主的进行内存回收，把所有不被占用的堆内存销毁（webkit浏览器）
   * 销毁内存：空对象指针，xx = null 可以让原始变量谁都不指向
   * 
   * 
   * 变量提升
   *    提升阶段，当执行到函数定义行时，就直接跳过函数创建的代码，
   *    调用，形成私有的栈内存，把之前存储的代码字符串执行代码，
   *    私有也是进行变量提升，也不会立即代码执行，变量提升前，先进行
   *    形参赋值，
   * 
   * 
   * 
   * 
   * 
   */

   var a = 12 // 全局变量a
   console.log(window.a)  // window的一个属性名a  12

    for(i = 0; i<5; i++){
      
    }

    var a = 12 // 直接拿值操作，一个变量只能和一个值关联
    var b = a  // 把a存储的值，存储到一个新位置上，直接操作值，让新位置的值和b保持关联

    var ary1 = [12, 13]  // 由于比较复杂，新开辟一个内存空间  0:12 1:23 length:2 存储一个地址
    var ary2 = ary1  // ary2也存储ary1的地址
    ary2.push(100)   // 本身没有值，通过指针指向空间，
    ary1 = null
    console.log(ary2)





    // 把函数内容用字符串形式存储在，指针指向的内存空间中
    function sum(){
      var total = 0
      for (var i =0; i<arguments.length; i++){
        var item = arguments[i]
        item = parseFloat(item)
        !isNaN(item) ? total += item : null
      }
      return total
    }
    // 函数执行，都会形成一个私有作用域，目的是让代码块执行，把 
    console.log(sum(12, 32, '45')) // 找到对应的空间 

    // 栈内存：作用域 --- 1，提供一个供js代码执行的环境，执行栈

    // 堆内存：

    console.log('-------------------')
    console.log(cc)
    var d = 12

    function cc(){
      console.log('cc')
    }
  </script>
</body>
</html>